home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #14 / Monster Media No. 14 (April 1996) (Monster Media, Inc.).ISO / prog_d / mdexp12.zip / MAIN.PAS < prev    next >
Pascal/Delphi Source File  |  1996-01-03  |  12KB  |  402 lines

  1. unit Main;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  7.   Forms, Dialogs, Connect, DBTables, DB, StdCtrls, Mask, DBCtrls, ExtCtrls,
  8.   Buttons, Grids, Outline, Mdexplor, DBGrids;
  9.  
  10. type
  11.   TDemoForm1 = class(TForm)
  12.     Panel3: TPanel;
  13.     Label2: TLabel;
  14.     Image1: TImage;
  15.     Panel4: TPanel;
  16.     SpeedButton1: TSpeedButton;
  17.     SpeedButton2: TSpeedButton;
  18.     SpeedButton3: TSpeedButton;
  19.     DBNavigator1: TDBNavigator;
  20.     Panel2: TPanel;
  21.     Label1: TLabel;
  22.     Panel5: TPanel;
  23.     Notebook1: TNotebook;
  24.     Label8: TLabel;
  25.     DBText1: TDBText;
  26.     Label5: TLabel;
  27.     DBEdit4: TDBEdit;
  28.     DBText2: TDBText;
  29.     Label9: TLabel;
  30.     Label10: TLabel;
  31.     Label6: TLabel;
  32.     DBEdit5: TDBEdit;
  33.     DBEdit7: TDBEdit;
  34.     DBText4: TDBText;
  35.     Label11: TLabel;
  36.     Label12: TLabel;
  37.     Label7: TLabel;
  38.     DBEdit6: TDBEdit;
  39.     DBEdit8: TDBEdit;
  40.     Label13: TLabel;
  41.     Label14: TLabel;
  42.     Label15: TLabel;
  43.     Label16: TLabel;
  44.     Label17: TLabel;
  45.     DBEdit3: TDBEdit;
  46.     DBEdit9: TDBEdit;
  47.     DBEdit10: TDBEdit;
  48.     DBEdit11: TDBEdit;
  49.     DBEdit12: TDBEdit;
  50.     Label3: TLabel;
  51.     Label4: TLabel;
  52.     Label18: TLabel;
  53.     DBText3: TDBText;
  54.     Label19: TLabel;
  55.     Label20: TLabel;
  56.     Label21: TLabel;
  57.     Label22: TLabel;
  58.     Label23: TLabel;
  59.     DBEdit1: TDBEdit;
  60.     DBEdit2: TDBEdit;
  61.     DBEdit13: TDBEdit;
  62.     DBEdit14: TDBEdit;
  63.     DBEdit15: TDBEdit;
  64.     DBEdit16: TDBEdit;
  65.     DBEdit17: TDBEdit;
  66.     Table1: TTable;
  67.     Table1Company: TStringField;
  68.     Table1CustNo: TFloatField;
  69.     DataSource1: TDataSource;
  70.     Table2: TTable;
  71.     Table2OrderNo: TFloatField;
  72.     Table2CustNo: TFloatField;
  73.     Table2PO: TStringField;
  74.     Table2AmountPaid: TCurrencyField;
  75.     Table2EmpNo: TIntegerField;
  76.     DataSource2: TDataSource;
  77.     Table4: TTable;
  78.     Table4ItemNo: TFloatField;
  79.     Table4Description: TStringField;
  80.     Table4OrderNo: TFloatField;
  81.     Table4Qty: TIntegerField;
  82.     Table4PartNo: TFloatField;
  83.     DataSource4: TDataSource;
  84.     Table3: TTable;
  85.     Table3VendorName: TStringField;
  86.     Table3PartNo: TFloatField;
  87.     Table3VendorNo: TFloatField;
  88.     Table3Description: TStringField;
  89.     Table3OnHand: TFloatField;
  90.     Table3OnOrder: TFloatField;
  91.     Table3Cost: TCurrencyField;
  92.     Table3ListPrice: TCurrencyField;
  93.     DataSource3: TDataSource;
  94.     Table5: TTable;
  95.     Table5VendorNo: TFloatField;
  96.     Table5VendorName: TStringField;
  97.     Table5Address1: TStringField;
  98.     Table5Address2: TStringField;
  99.     Table5City: TStringField;
  100.     Table5State: TStringField;
  101.     Table5Zip: TStringField;
  102.     Table5Country: TStringField;
  103.     Table5Phone: TStringField;
  104.     Table5FAX: TStringField;
  105.     Table5Preferred: TBooleanField;
  106.     DataSource5: TDataSource;
  107.     MDExplorer: TMDExplorer;
  108.     Connections1: TConnections;
  109.     ComboBox1: TComboBox;
  110.     Table6: TTable;
  111.     DataSource6: TDataSource;
  112.     Table7: TTable;
  113.     DataSource7: TDataSource;
  114.     Connections2: TConnections;
  115.     Table6VendorNo: TFloatField;
  116.     Table6VendorName: TStringField;
  117.     Table6City: TStringField;
  118.     Table6State: TStringField;
  119.     Table6Country: TStringField;
  120.     Table6Phone: TStringField;
  121.     Table7PartNo: TFloatField;
  122.     Table7VendorNo: TFloatField;
  123.     Table7Description: TStringField;
  124.     Table7OnHand: TFloatField;
  125.     Table7OnOrder: TFloatField;
  126.     Table7Cost: TCurrencyField;
  127.     Table7ListPrice: TCurrencyField;
  128.     Table8: TTable;
  129.     DataSource8: TDataSource;
  130.     Connections3: TConnections;
  131.     Table8SpeciesNo: TFloatField;
  132.     Table8Common_Name: TStringField;
  133.     DBImage1: TDBImage;
  134.     Table8Graphic: TGraphicField;
  135.     Table8Notes: TMemoField;
  136.     DBMemo1: TDBMemo;
  137.     DBGrid1: TDBGrid;
  138.     Table9: TTable;
  139.     DataSource9: TDataSource;
  140.     Table9CustNo: TFloatField;
  141.     Table9Company: TStringField;
  142.     Table9Addr1: TStringField;
  143.     Table9Addr2: TStringField;
  144.     Table9City: TStringField;
  145.     Table9State: TStringField;
  146.     Table9Zip: TStringField;
  147.     Table9Country: TStringField;
  148.     Table9Phone: TStringField;
  149.     Table9FAX: TStringField;
  150.     Table9TaxRate: TFloatField;
  151.     Table9Contact: TStringField;
  152.     Table9LastInvoiceDate: TDateTimeField;
  153.     Connections4: TConnections;
  154.     procedure SpeedButton1Click(Sender: TObject);
  155.     procedure SpeedButton2Click(Sender: TObject);
  156.     procedure SpeedButton3Click(Sender: TObject);
  157.     procedure FormCreate(Sender: TObject);
  158.     procedure MDExplorerUpdating(Sender: TObject; Updating: Boolean);
  159.     procedure MDExplorerClick(Sender: TObject);
  160.     procedure Table4DescriptionGetText(Sender: TField;
  161.       var Text: OpenString; DisplayText: Boolean);
  162.     procedure Table3VendorNameGetText(Sender: TField; var Text: OpenString;
  163.       DisplayText: Boolean);
  164.     procedure ComboBox1Change(Sender: TObject);
  165.     procedure DataSource9DataChange(Sender: TObject; Field: TField);
  166.   private
  167.     { Private declarations }
  168.   public
  169.     { Public declarations }
  170.   end;
  171.  
  172. var
  173.   DemoForm1: TDemoForm1;
  174.  
  175. implementation
  176.  
  177. {$R *.DFM}
  178.  
  179.  
  180. { Plus SpeedButton ------------------------------------}
  181.  
  182. procedure TDemoForm1.SpeedButton1Click(Sender: TObject);
  183. begin
  184. { Expand the current node }
  185. with MDExplorer do
  186.   begin
  187.   Items[SelectedItem].Expand;
  188.   end;
  189. end;
  190.  
  191.  
  192. { Minus SpeedButton ----------------------------------}
  193.  
  194. procedure TDemoForm1.SpeedButton2Click(Sender: TObject);
  195. begin
  196. { Collapse the current node }
  197. with MDExplorer do
  198.   begin
  199.   Items[SelectedItem].Collapse;
  200.   end;
  201. end;
  202.  
  203.  
  204. { Edit SpeedButton ----------------------------------}
  205.  
  206. procedure TDemoForm1.SpeedButton3Click(Sender: TObject);
  207. begin
  208. { Hide/show the editing panel at bottom}
  209. if Panel5.Visible then
  210.   begin
  211.   Panel5.Visible := False;
  212.   SpeedButton3.Down := False;
  213.   end
  214. else
  215.   begin
  216.   Panel5.Visible := True;
  217.   SpeedButton3.Down := True;
  218.   end;
  219. end;
  220.  
  221.  
  222. { Form Creation -------------------------------}
  223.  
  224. procedure TDemoForm1.FormCreate(Sender: TObject);
  225. begin
  226. { Activate all datasources before activating
  227.   the TMDExplorer component. }
  228. Table1.Active := True;
  229. Table2.Active := True;
  230. Table4.Active := True;
  231. Table3.Active := True;
  232. Table5.Active := True;
  233. Table6.Active := True;
  234. Table7.Active := True;
  235. Table8.Active := True;
  236. Table9.Active := True;
  237.  
  238. Combobox1.ItemIndex := 0;  { Initialize ComboBox  }
  239. MDExplorer.Active := True; { Activate TMDExplorer }
  240. end;
  241.  
  242.  
  243. { TMDExplorer updating event handler ---------------------------}
  244.  
  245. procedure TDemoForm1.MDExplorerUpdating(Sender: TObject;
  246.                                         Updating: Boolean);
  247. begin
  248. { Some data-aware components slow down outline processing
  249.   if they are connected to the data model while the outline
  250.   is updating. Disconnect them from the data model while
  251.   the outline is updating by setting their DataSource to nil.
  252.   Do NOT use DisableControls because this also disconnects
  253.   datasouces from the master-detail model. TDBGrids should be
  254.   on a seperate model from TMDExplorer. In this case DBGrid1
  255.   is in the Grid Model and the MDOutline1 is in the Customers
  256.   Model. Synchronize two such data models with SyncTables.
  257.   SyncTables requires that both TTables be connected to the
  258.   same physical table, and that the two TTables use the same
  259.   index (Sequence numbers are used to prevent update
  260.   recursion.) }
  261. if Updating then { Begin updating TMDExplorer }
  262.   begin
  263.   { Disconnect any data-aware components here if they slow
  264.     down processing.}
  265.   DBImage1.DataSource := nil;
  266.   DBMemo1.DataSource := nil;
  267.   end
  268. else  {End updating TMDExplorer }
  269.   begin
  270.   { Re-connect slow data-aware components here }
  271.   DBImage1.DataSource := DataSource8;
  272.   DBMemo1.DataSource := Datasource8;
  273.  
  274.   { This ensures that changes in the Explorer are reflected
  275.     in the Grid. Disconnecting the grid by setting its
  276.     datasource to nil will cause a flash.
  277.     See DataSource9.OnDataChange event for more details.}
  278.   SyncTables(Table9,Table1);  { Move Table9 (Grid) to match Table1 (Explorer) }
  279.  
  280.   { For this demo, we set the notebook's page index to display
  281.     the current level's edit controls, and we set the navigator
  282.     to navigate the current level's datasource. Levels begin
  283.     at one, pages at zero.}
  284.   Notebook1.PageIndex := MDExplorer.CurrentLevel-1;
  285.   DBNavigator1.DataSource := MDExplorer.CurrentDataSource;
  286.   end;
  287. end;
  288.  
  289.  
  290. { TMDExplorer Click event handler -------------------------}
  291.  
  292. procedure TDemoForm1.MDExplorerClick(Sender: TObject);
  293. begin
  294. { Set the notebook page to display the current level's edit
  295.   controls, and set the navigator to navigate the current
  296.   level's datasource.}
  297. Notebook1.PageIndex := MDExplorer.CurrentLevel-1;
  298. DBNavigator1.DataSource := MDExplorer.CurrentDataSource;
  299. end;
  300.  
  301. {**************************************************************}
  302. {* The OnCalcFields event does not seem to work correctly with*}
  303. {* the TMDExplorer. Instead, use each field's GetText method  *}
  304. {* for calculated fields. This MAY be a bug in Delphi.        *}
  305. {**************************************************************}
  306.  
  307. { Calculate part description for ITEMS level --------------}
  308.  
  309. procedure TDemoForm1.Table4DescriptionGetText(Sender: TField;
  310.   var Text: OpenString; DisplayText: Boolean);
  311. begin
  312. { Table4=ITEMS, Table3=PARTS, ITEMS >---|- PARTS }
  313. { Move PARTS Description up one level to ITEMS level.}
  314. Text := Table3Description.AsString;
  315. end;
  316.  
  317.  
  318. { Calculate vendor name for PARTS level -----------------}
  319.  
  320. procedure TDemoForm1.Table3VendorNameGetText(Sender: TField;
  321.   var Text: OpenString; DisplayText: Boolean);
  322. begin
  323. { Table3=PARTS, Table5=VENDORS, PARTS >---|- VENDORS }
  324. { Move VENDORS VendorName up one level to PARTS level.}
  325. Text := Table5VendorName.AsString;
  326. end;
  327.  
  328.  
  329. { ComboBox event handler to change views ------------}
  330.  
  331. procedure TDemoForm1.ComboBox1Change(Sender: TObject);
  332. begin
  333. { Change views by dynamically changing the TMDExplorer
  334.   DataSources. Make TMDExplorer inactive before making
  335.   such changes.}
  336. case ComboBox1.ITemIndex of
  337.  0: { Customers View }
  338.   begin
  339.   { Enable editing for Customers view}
  340.   SpeedButton3.Visible := True;
  341.   if SpeedButton3.Down then Panel5.Visible := True;
  342.   DBImage1.Visible := False;
  343.   DBMemo1.Visible := False;
  344.  
  345.   MDExplorer.Active := False;
  346.   MDExplorer.DataSource1 := DataSource1; {CUSTOMER}
  347.   MDExplorer.DataSource2 := DataSource2; {ORDERS}
  348.   MDExplorer.DataSource3 := DataSource4; {ITEMS}
  349.   MDExplorer.DataSource4 := DataSource3; {PARTS}
  350.   MDExplorer.DataSource5 := DataSource5; {VENDORS}
  351.   MDExplorer.Active := True;
  352.   end;
  353.  1: { Vendors View }
  354.   begin
  355.   { Disable editing for Vendors view for simplicity }
  356.   SpeedButton3.Visible := False;
  357.   Panel5.Visible := False;
  358.   DBImage1.Visible := False;
  359.   DBMemo1.Visible := False;
  360.  
  361.   MDExplorer.Active := False;
  362.   MDExplorer.DataSource1 := DataSource6;  {VENDORS}
  363.   MDExplorer.DataSource2 := DataSource7;  {PARTS}
  364.   MDExplorer.DataSource3 := nil;
  365.   MDExplorer.DataSource4 := nil;
  366.   MDExplorer.DataSource5 := nil;
  367.   MDExplorer.Active := True;
  368.   end;
  369.  2: { Fish View }
  370.   begin
  371.   { Disable editing for Fish view for simplicity }
  372.   SpeedButton3.Visible := False;
  373.   Panel5.Visible := False;
  374.   DBImage1.Visible := True;
  375.   DBMemo1.Visible := True;
  376.  
  377.   MDExplorer.Active := False;
  378.   MDExplorer.DataSource1 := DataSource8;  {BIOLIFE}
  379.   MDExplorer.DataSource2 := nil;
  380.   MDExplorer.DataSource3 := nil;
  381.   MDExplorer.DataSource4 := nil;
  382.   MDExplorer.DataSource5 := nil;
  383.   MDExplorer.Active := True;
  384.   end;
  385. end;
  386. end;
  387.  
  388. procedure TDemoForm1.DataSource9DataChange(Sender: TObject; Field: TField);
  389. begin
  390. { Synchronize the Grid Model with the Customers Model. This
  391.   is necessary for changes in the grid to be reflected in
  392.   the Explorer. SyncTables is provided for this purpose.
  393.   A TMDExplorer cannot be connected to the same data model
  394.   as a DBGrid because there is no way to make the DBGrid
  395.   not update as the TMDExplorer updates. DisableControls
  396.   will disconnect the Master-Detail datasources from one
  397.   another, and any other trick makes the grid flash badly.}
  398. SyncTables(Table1,Table9); { Move Table1 to match Table9. }
  399. end;
  400.  
  401. end.
  402.